﻿#ifndef NOSEPIECEYN_H
#define NOSEPIECEYN_H


/// @abstract  南京甬宁电动物镜转盘的驱动代码。
/// @author 李渊
/// @date 2018.04.08
/// @version 1.0
/// @copyright 北京经海科技有限公司
/// @details 南京甬宁电动物镜转盘采用 RS232 串口控制，串口参数 9600,N,8,1。 物镜转盘支持 4 颗物镜，编号为 0..3。
///

#include <QObject>
#include <QSerialPort>
#include <QTimer>

class NosepieceYN : public QObject
{
    Q_OBJECT
public:
    explicit NosepieceYN(QObject *parent = nullptr);
    ~NosepieceYN();
    /**
     * @brief open 打开物镜转盘对应的串口，同时将物镜转盘转到第一个物镜。如果串口已经被打开，则关闭之后重新打开
     * @param port 串口名，类似 "COM1" 这样的。
     * @return 串口打开成功则返回 true，否则 false
     */
    bool open(QString port);
signals:
    /**
     * @brief lensChanged 当物镜转换完成后发出这个信号。
     * @param oldlens 旧的物镜位置
     * @param newLens 新的物镜位置
     */
    void lensChanged(int oldlens,int newLens);
    /**
     * @brief error 当物镜转盘出现错误时发出这个信号
     */
    void error();
    /**
     * @brief timeout 当发给物镜转盘的命令没有得到回应时发出这个信号
     */
    void timeout();
public slots:
    /**
     * @brief setLens 将物镜转盘转动到第 n 个物镜
     * @param n [0..3] 将物镜转盘转动到第 n 个物镜
     */
    void setLens(int n);                            //to position n
    /**
     * @brief setLens 将物镜转盘转动到第 newLens 个物镜
     * @param oldLens
     * @param newLens
     */
    void setLens(int oldLens,int newLens);          //to position new
    /**
     * @brief forward 将物镜转盘转动到下一个位置
     */
    void forward();                                 //turn to next
    /**
     * @brief reverse 将物镜转盘转动到前一个位置
     */
    void reverse();
    /**
     * @brief close 关闭物镜转盘对应的串口
     */
    void close();
    //turn to previous
private slots:
    void on_readyRead();
    void on_timer();
private:
    void state(unsigned char s);
    QSerialPort * m_serialPort;
    QTimer * m_timer;
    const char m_data[4] = {0x0a, 0x0b, 0x0c, 0x0d};
    int m_lens;
    int m_newLens;
    int m_state;
};

#endif // NOSEPIECEYN_H
